home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 22 / CU Amiga Magazine's Super CD-ROM 22 (1998)(EMAP Images)(GB)[!][issue 1998-05].iso / PowerPC / Programming / vbcc / machines / amigappc / startup / startup.s < prev   
Encoding:
Text File  |  1998-02-18  |  13.8 KB  |  660 lines

  1. ##
  2. ## startup.s
  3. ##
  4. ## VBCC startup code for PowerPC programs using the PowerUp kernel.
  5. ## (c)1997-98 by Frank Wille
  6. ##
  7. ## This startup code is intended to work with vbcc's PPCRun,
  8. ## SAS/C's RunELF, P5's PPCLoad and P5's ELF-LoadSeg-Patch.
  9. ## If it doesn't get stdin/stdout/stderr from PPCRun or from the
  10. ## LoadSeg-patch, they will be initialized here. The CLI command line
  11. ## or WB startup message is parsed and finally _main(int argc,char **argv)
  12. ## will be called.
  13. ##
  14. ## argc=0 indicates a WBStartup and the WB-message pointer can
  15. ## be found in argv, *if* argv is not zero!!
  16. ## If argv is zero too, then we have no arguments at all! Maybe
  17. ## we are called by PPCLoad, or something like that...
  18. ##
  19. ## WB-startup relies on the calling M68k process for receiving and
  20. ## replying the startup message.
  21. ##
  22. ##
  23. ## Global Functions:
  24. ## _exit:    Private! Will be called by vbcc's legal exit() function.
  25. ## exit:    MINSTART-only exit()-function.
  26. ##
  27. ## Global Data:
  28. ## SysBase:    The usual pointer to the ExecBase structure.
  29. ## _stdin, _stdout, _stderr : Private! Will be used by vbcc's _main()
  30. ##        startup routine to initialize ANSI-stdio.
  31. ##        Undefined for MINSTART.
  32. ## WBenchMsg:    Pointer to WB-startup message, when started from WB.
  33. ##        Undefined, if WBSTART was not set.
  34. ##
  35. ##
  36. ## V1.0 15-Feb-98 phx
  37. ##    Supports WBStartup and Ralph Schmidt's ELFLoadSegPatch.
  38. ##    On WB-startup, the global variable WBenchMsg contains a pointer
  39. ##    to the WB-startup message (also via argv). stdin,stdout and
  40. ##    stderr will contain a handle of the WB-ToolWindow or, if this
  41. ##    fails, from "NIL:".
  42. ##    Floating point registers are no longer saved.
  43. ##    Minimal startup code can be generated by defining MINSTART.
  44. ##    Some minor optimizations and fixes.
  45. ## V0.9 23-Dec-97 phx
  46. ##    No longer expect argc/argv from ppcrun/elfrun/etc.. A command
  47. ##    line pointer is received in r3 and must be parsed first. If no
  48. ##    problems occur, _main() will receive argc/argv as usual. Other-
  49. ##    wise it will get argc=argv=0.
  50. ##    Still no WB-startup support...
  51. ##    Fixed a bug with stderr (Enforcer-hit/IsInteractive()) in
  52. ##    "Non-StartupMessage mode".
  53. ##    Successfully tested with ppc.library V45.2.
  54. ## V0.8 21-Nov-97 phx
  55. ##    CallOS()-fix for ppc.library V44.29 with old libamiga.a.
  56. ## V0.7 02-Nov-97 phx
  57. ##    Shorter startup code by using stmw/lmw.
  58. ## V0.6 18-Oct-97 phx
  59. ##    The ppc.library executes ELF objects at .text+4, so the first
  60. ##    instruction was always skipped... :(
  61. ##    SysBase is exported. DOSBase must be initialized by _main().
  62. ## V0.5 15-Oct-97 phx
  63. ##    Also works with R.Schmidt's ppcload.
  64. ##    Supports blr in _main(), although libvc.a jumps to _exit directly.
  65. ##      No longer use r13 for debugging output. It's reserved for
  66. ##    Small Data pointer in V.4. :P
  67. ## V0.4 13-Oct-97 phx
  68. ##    No longer touches r2. r2 is reserved in System V.4 ABI!
  69. ## V0.3 07-Oct-97 phx
  70. ##    Rewritten in pure PowerPC assembler (pasm).
  71. ## V0.2 04-Oct-97 phx
  72. ##      Use "CONSOLE:" instead "*" (PowerPC will definitely not run
  73. ##      under Kickstart 1.x :)
  74. ##      argc and argv are passed via startup message. argc and argv are
  75. ##      also passed in GPR3 and GPR4 but I will better read them from the
  76. ##      startup message...
  77. ##      When the program terminates, the result code is returned in
  78. ##      the startup message, which is replied then.
  79. ## V0.1 03-Oct-97 phx
  80. ##      created
  81.  
  82.  
  83. # Version
  84. .set    VERSION,1
  85. .set    REVISION,00
  86.  
  87. # Startup Code Configuration
  88. #.set    DEBUG,1        # enables serial debugging
  89. #.set    WAITBUTTON,1    # wait for left mouse button, after debugging
  90. #            #  output (must be used together with DEBUG)
  91. #.set    CALLOSFIX,1    # ppc.library V44.29 has PPCCallOS(), but
  92. #            #  old libamiga.a stil uses CallOS().
  93. #.set    WBSTART,1    # enables WB-startup support code
  94. #.set    MINSTART,1    # create a minimal startup-code, without
  95. #            #  argument parsing. main() is called directly.
  96.  
  97.  
  98. # powerup includes
  99. .set    PPCTASKTAG_STARTUP_MSG,0x80020015
  100. .set    PPCTASKTAG_STARTUP_MSGDATA,0x80020016
  101.  
  102.  
  103. # workbench includes
  104.  
  105. # struct WBStartup
  106. .set    sm_Message,0
  107. .set    sm_Process,20
  108. .set    sm_Segment,24
  109. .set    sm_NumArgs,28
  110. .set    sm_ToolWindow,32
  111. .set    sm_ArgList,36
  112. .set    sm_SIZEOF,40
  113.  
  114. # struct WBArg
  115. .set    wa_Lock,0
  116. .set    wa_Name,4
  117. .set    wa_SIZEOF,8
  118.  
  119.  
  120. # dos includes
  121. .set    MODE_OLDFILE,1005
  122. .set    MODE_NEWFILE,1006
  123.  
  124.  
  125. # struct StartupData
  126. .set    sd_M68kPort,0    # the PowerPC task can send messages to this port
  127. .set    sd_std_in,4    # standard input handle
  128. .set    sd_std_out,8    # standard output handle
  129. .set    sd_std_err,12    # standard error handle
  130. .set    sd_retCode,16    # return code of PPC program
  131. .set    sd_flags,20    # additional flags (currently unused)
  132.  
  133.  
  134. .set    IOERROR,50    # can't open stdin/stdout/stderr
  135.  
  136.  
  137. # serial debugging
  138. .ifdef    DEBUG
  139.     .extern    PPCRawDoFmt
  140.  
  141. .macro    _debug        # _debug <format string>[,<gpr>, ...]
  142.     .data        # ... works with all GPRs, except r12
  143. .db\@:    .string    \1
  144.     .text
  145.     stwu    r12,-4(r1)
  146.     lis    r12,.regsave@ha
  147.     addi    r12,r12,.regsave@l
  148.     stw    r0,0(r12)
  149.     stw    r3,4(r12)
  150.     stw    r4,8(r12)
  151.     stw    r5,12(r12)
  152.     stw    r6,16(r12)
  153.     stw    r7,20(r12)
  154.     stw    r8,24(r12)
  155.     stw    r9,28(r12)
  156.     stw    r10,32(r12)
  157.     stw    r11,36(r12)
  158.     lwz    r3,0(r1)
  159.     addi    r1,r1,4
  160.     stw    r3,40(r12)
  161.     lwz    r3,4(r12)
  162.     .ifge    $NARG-2
  163.     lis    r12,.datastream@ha
  164.     addi    r12,r12,.datastream@l
  165.     stw    \2,0(r12)
  166.     .endif
  167.     .ifge    $NARG-3
  168.     stw    \3,4(r12)
  169.     .endif
  170.     .ifge    $NARG-4
  171.     stw    \4,8(r12)
  172.     .endif
  173.     .ifge    $NARG-5
  174.     stw    \5,12(r12)
  175.     .endif
  176.     .iflt    $NARG-2
  177.     li    r4,0
  178.     .else
  179.     mr    r4,r12
  180.     .endif
  181.     lis    r3,(.db\@)@ha
  182.     addi    r3,r3,(.db\@)@l
  183.     li    r5,1
  184.     li    r6,0
  185.     bl    PPCRawDoFmt        # output to serial line
  186. .ifdef    WAITBUTTON
  187.     lis    r12,0xbfe001@h        # wait for left mouse button
  188.     ori    r12,r12,0xbfe001@l
  189. .dbwait1\@:
  190.     lbz    r3,0(r12)
  191.     andi.    r3,r3,0x40
  192.     bne    .dbwait1\@
  193. .dbwait2\@:
  194.     lbz    r3,0(r12)
  195.     andi.    r3,r3,0x40
  196.     beq    .dbwait2\@
  197. .endif
  198.     lis    r12,.regsave@ha
  199.     addi    r12,r12,.regsave@l
  200.     lwz    r0,0(r12)
  201.     lwz    r3,4(r12)
  202.     lwz    r4,8(r12)
  203.     lwz    r5,12(r12)
  204.     lwz    r6,16(r12)
  205.     lwz    r7,20(r12)
  206.     lwz    r8,24(r12)
  207.     lwz    r9,28(r12)
  208.     lwz    r10,32(r12)
  209.     lwz    r11,36(r12)
  210.     lwz    r12,40(r12)
  211. .endm
  212.  
  213. .else
  214. .macro    _debug
  215. .endm
  216. .endif
  217.  
  218.  
  219.     .text
  220.  
  221.     .extern    PPCGetTaskAttr
  222.     .extern    PPCOpen
  223.     .extern    PPCClose
  224.     .extern    PPCAllocVec
  225.     .extern    PPCFreeVec
  226. .ifdef    MINSTART
  227.     .extern    main
  228. .else
  229.     .extern    _main
  230. .endif
  231.  
  232.  
  233. # This is the first function in a program. Execution starts here!
  234.  
  235. __start:
  236. # CLI-start:
  237. #  r3 = char *CommandLine
  238. #  r4 = NULL
  239. # WB-start:
  240. #  r3 = NULL
  241. #  r4 = struct WBStartup *WBMsg
  242.     .word    0x56424343        # ppc.library calls __start+4 !
  243.     mflr    r0
  244.     stw    r0,4(r1)
  245.     stwu    r1,-80(r1)
  246.     stmw    r14,8(r1)        # save all non-volatile GP-registers
  247.     _debug    "\n-------\nstartup\n-------\nstack = 0x%08lx\n",r1
  248.     lis    r11,_init_stk@ha    # save initial stack pointer
  249.     stw    r1,_init_stk@l(r11)
  250.  
  251. # initialize SysBase
  252.     li    r11,4
  253.     lwz    r0,0(r11)
  254.     lis    r11,SysBase@ha
  255.     stw    r0,SysBase@l(r11)
  256. .ifndef    MINSTART
  257.     mr    r30,r3            # r30 CommandLine
  258. .ifdef    WBSTART
  259.     mr    r31,r4            # r31 WBMsg
  260. .endif
  261.  
  262. # evaluate startup message from M68k
  263.     lis    r3,PPCTASKTAG_STARTUP_MSG@h
  264.     ori    r3,r3,PPCTASKTAG_STARTUP_MSG@l
  265.     bl    PPCGetTaskAttr
  266.     _debug    "PPCTASKTAG_STARTUP_MSG = 0x%08lx\n",r3
  267.     cmpwi    r3,0
  268.     beq    .1
  269.     lis    r3,PPCTASKTAG_STARTUP_MSGDATA@h
  270.     ori    r3,r3,PPCTASKTAG_STARTUP_MSGDATA@l
  271.     bl    PPCGetTaskAttr
  272.     _debug    "PPCTASKTAG_STARTUP_MSGDATA = 0x%08lx\n",r3
  273.     lwz    r4,sd_std_in(r3)    # get _stdin
  274.     lis    r11,_stdin@ha
  275.     stw    r4,_stdin@l(r11)
  276.     lwz    r5,sd_std_out(r3)    # get _stdout
  277.     lis    r11,_stdout@ha
  278.     stw    r5,_stdout@l(r11)
  279.     lwz    r6,sd_std_err(r3)    # get _stderr
  280.     lis    r11,_stderr@ha
  281.     stw    r6,_stderr@l(r11)
  282.     lis    r11,_startup_data@ha
  283.     stw    r3,_startup_data@l(r11)
  284.     _debug    "stdin=0x%08lx stdout=0x%08lx stderr=0x%08lx\n",r4,r5,r6
  285.     b    .parse_args
  286.  
  287. # get _stdin, _stdout, _stderr
  288. .1:    lis    r16,.constring@ha    # r16 = "CONSOLE:"
  289.     addi    r16,r16,.constring@l
  290.     li    r4,MODE_OLDFILE
  291.     mr    r3,r16
  292.     bl    PPCOpen            # PPCOpen("CONSOLE:",MODE_OLDFILE)
  293.     _debug    "PPCOpen(\"%s\",MODE_OLDFILE) = 0x%08lx\n",r16,r3
  294.     cmpwi    r3,0
  295.     beq    __error
  296.     lis    r11,_stdin@ha
  297.     stw    r3,_stdin@l(r11)
  298.  
  299.     li    r4,MODE_NEWFILE
  300.     mr    r3,r16
  301.     bl    PPCOpen            # PPCOpen("CONSOLE:",MODE_NEWFILE)
  302.     _debug    "PPCOpen(\"%s\",MODE_NEWFILE) = 0x%08lx\n",r16,r3
  303.     cmpwi    r3,0
  304.     beq    __error
  305.     lis    r11,_stdout@ha
  306.     stw    r3,_stdout@l(r11)
  307.     lis    r12,_stderr@ha
  308.     stw    r3,_stderr@l(r12)    # _stderr = _stdout
  309.  
  310. # parse cli or wb arguments
  311. .parse_args:
  312.     li    r14,0            # r14: argc = 0
  313.     mr.    r15,r30            # r15: command line/argv
  314.     beq    .wbmsg
  315.     bl    parse_cli_args        # parse command line
  316.     b    .startup
  317. .wbmsg:
  318. .ifdef    WBSTART
  319.     mr.    r15,r31            # WBMsg?
  320.     bnel    parse_wb_args
  321. .endif
  322.  
  323. # call _main in libvc.a
  324. .startup:
  325.     mr    r3,r14
  326.     mr    r4,r15
  327.     _debug    "calling _main(argc=%ld,argv=0x%08lx)\n",r3,r4
  328.     bl    _main            # _main(argc,argv)
  329.     li    r3,0
  330.     b    _exit
  331. .else    # MINSTART
  332.     bl    main
  333.     li    r3,0
  334. .endif
  335.  
  336.     .type    __start,@function
  337.     .size    __start,$-__start
  338.  
  339.  
  340. .ifndef    MINSTART
  341. __error:
  342.     li    r3,IOERROR        # error: can't open stdin/stdout
  343.  
  344.  
  345.     .global    _exit
  346. _exit:
  347. # r3 = return code
  348.     mr    r14,r3
  349.     _debug    "\n-----\n_exit\n-----\nstack = 0x%08lx\nrc = %ld\n",r1,r14
  350.  
  351. .ifdef    WBSTART
  352. # If we ran from WB, then close _wbOutput.
  353. # There's no need to reply the WBMsg, because the calling M68k
  354. # task (or LoadSeg-patch) does it for us.
  355.     lis    r11,_wbOutput@ha
  356.     lwz    r3,_wbOutput@l(r11)
  357.     cmpwi    r3,0
  358.     beq    .5
  359.     _debug    "PPCClose(wbout=0x%08lx)\n",r3
  360.     bl    PPCClose
  361. .endif
  362.  
  363. # free argv
  364. .5:    lis    r11,_argv@ha
  365.     lwz    r3,_argv@l(r11)
  366.     cmpwi    r3,0
  367.     beq    .6
  368.     _debug    "PPCFreeVec(argv=0x%08lx)\n",r3
  369.     bl    PPCFreeVec
  370.  
  371. .6:    lis    r15,_startup_data@ha
  372.     lwz    r15,_startup_data@l(r15)
  373.     cmpwi    r15,0            # did we receive a startup message?
  374.     bne    .3
  375.  
  376. # close _stdout and _stdin, when started without startup message
  377.     lis    r11,_stdout@ha
  378.     lwz    r3,_stdout@l(r11)
  379.     cmpwi    r3,0
  380.     beq    .2
  381.     _debug    "PPCClose(stdout=0x%08lx)\n",r3
  382.     bl    PPCClose
  383. .2:    lis    r11,_stdin@ha
  384.     lwz    r3,_stdin@l(r11)
  385.     cmpwi    r3,0
  386.     beq    .4
  387.     _debug    "PPCClose(stdin=0x%08lx)\n",r3
  388.     bl    PPCClose
  389.     b    .4
  390.  
  391. # write return code to startup message
  392. .3:    _debug    "store rc=%ld in startup data (0x%08lx)\n",r14,r15
  393.     stw    r14,sd_retCode(r15)
  394.  
  395. # restore initial stack frame
  396. .4:    mr    r3,r14
  397. .else    # MINSTART
  398.     .global    exit
  399. exit:
  400. # r3 = return code
  401. .endif
  402.     lis    r11,_init_stk@ha
  403.     lwz    r1,_init_stk@l(r11)
  404.     _debug    "restored stack = 0x%08lx\n",r1
  405.     lmw    r14,8(r1)
  406.     addi    r1,r1,80
  407.     lwz    r0,4(r1)
  408.     mtlr    r0
  409.     blr
  410.  
  411. .ifdef    MINSTART
  412.     .type    exit,@function
  413.     .size    exit,$-exit
  414. .else
  415.     .type    _exit,@function
  416.     .size    _exit,$-_exit
  417. .endif
  418.  
  419.  
  420. .ifdef    CALLOSFIX
  421.     .extern    PPCCallOS
  422.     .global    CallOS
  423. CallOS:
  424.     b    PPCCallOS
  425.  
  426.     .type    CallOS,@function
  427.     .size    CallOS,$-CallOS
  428. .endif
  429.  
  430.  
  431. .ifndef    MINSTART
  432. .ifdef    WBSTART
  433. parse_wb_args:
  434. # Parse WBStartup message, init some global variables
  435. # r14: argc=0
  436. # r15: argv = WBStartup message
  437.     _debug    "WB-Startup 0x%08lx\n",r15
  438.     mflr    r16
  439.     lis    r11,WBenchMsg@ha
  440.     stw    r15,WBenchMsg@l(r11)    # store global WBenchMsg
  441.     lwz    r3,sm_ToolWindow(r15)
  442.     cmpwi    r3,0
  443.     bne    .wb1            # window argument?
  444.     lis    r3,.nilstring@ha    # otherwise, open "NIL:"
  445.     addi    r3,r3,.nilstring@l
  446. .wb1:    li    r4,MODE_OLDFILE
  447.     bl    PPCOpen
  448.     lis    r11,_wbOutput@ha
  449.     stw    r3,_wbOutput@l(r11)
  450.     cmpwi    r3,0
  451.     beq    __error
  452.     lis    r11,_stdin@ha        # set stdin, stdout, stderr
  453.     stw    r3,_stdin@l(r11)
  454.     lis    r11,_stdout@ha
  455.     stw    r3,_stdout@l(r11)
  456.     lis    r11,_stderr@ha
  457.     stw    r3,_stderr@l(r11)
  458.     mtlr    r16
  459.     blr
  460.  
  461.     .type    parse_wb_args,@function
  462.     .size    parse_wb_args,$-parse_wb_args
  463. .endif
  464.  
  465.  
  466. parse_cli_args:
  467. # Parse command line and generate argc/argv.
  468. # r14: argc=0
  469. # r15: cmdline (0-terminated, includes program name), will become argv
  470.     _debug    "CLI-Startup 0x%08lx\n",r15
  471.     mflr    r17
  472.     mr    r10,r15
  473.     li    r16,0
  474. .pa1:    bl    nextarg
  475.     cmpwi    r3,0
  476.     beq    .pa2
  477.     addi    r16,r16,4        # another argv slot
  478.     bl    skiparg
  479.     cmpwi    r3,0
  480.     bne    .pa1
  481. .pa2:    cmpwi    r16,0
  482.     beq    .pa_nomem        # no arguments found?
  483.     addi    r16,r16,4        # + one termination slot
  484.     sub    r3,r10,r15
  485.     add    r3,r3,r16
  486.     li    r4,0            # MEMF_ANY
  487.     bl    PPCAllocVec        # memory for argv slots and buffer
  488.     mr    r10,r15
  489.     mr.    r15,r3
  490.     beq    .pa_nomem
  491.     lis    r9,_argv@ha
  492.     stw    r15,_argv@l(r9)
  493.     subi    r9,r15,4        # r9 argv slots
  494.     add    r16,r15,r16        # r16 argv buffer
  495. .pa4:    bl    nextarg
  496.     cmpwi    r3,0
  497.     beq    .pa_quit
  498.     stwu    r16,4(r9)        # store arg-pointer
  499.     addi    r14,r14,1        # increment argc
  500.     cmpwi    r3,0x22
  501.     bne    .pa10            # quoted?
  502. .pa5:    lbzu    r3,1(r10)
  503.     cmpwi    r3,0x22
  504.     bne    .pa6
  505.     addi    r10,r10,1        # end quote
  506.     li    r3,0
  507. .pa6:    cmpwi    r3,'*'            # BCPL escape character?
  508.     bne    .pa8
  509.     lbzu    r3,1(r10)
  510.     andi.    r4,r3,0xdf
  511.     cmpwi    r4,'N'            # newline
  512.     bne    .pa7
  513.     li    r3,10
  514. .pa7:    cmpwi    r4,'E'            # escape
  515.     bne    .pa8
  516.     li    r3,27
  517. .pa8:    stb    r3,0(r16)
  518.     addi    r16,r16,1
  519.     cmpwi    r3,0
  520.     bne    .pa5
  521.     b    .pa4
  522. .pa10:    stb    r3,0(r16)        # normal arg copy
  523.     addi    r16,r16,1
  524.     lbzu    r3,1(r10)
  525.     cmplwi    r3,0x20
  526.     bgt    .pa10
  527.     li    r3,0
  528.     b    .pa8
  529.  
  530. .pa_nomem:
  531.     li    r15,0
  532.     mtlr    r17
  533.     blr
  534. .pa_quit:
  535.     stwu    r3,4(r9)        # r3=0 terminates the arguments
  536.     mtlr    r17
  537.     blr
  538.  
  539.     .type    parse_cli_args,@function
  540.     .size    parse_cli_args,$-parse_cli_args
  541.  
  542.  
  543. nextarg:
  544. # move pointer to beginning of next argument
  545. # r10: cmdline-pointer
  546. # -> r10: new cmdline-pointer, r3: char
  547.     lbz    r3,0(r10)
  548.     cmplwi    r3,0x20
  549.     bgtlr
  550.     cmpwi    r3,0
  551.     beqlr
  552.     addi    r10,r10,1
  553.     b    nextarg
  554.  
  555.     .type    nextarg,@function
  556.     .size    nextarg,$-nextarg
  557.  
  558.  
  559. skiparg:
  560. # move pointer behind the current argument
  561. # r10: cmdline-pointer
  562. # -> r10: new cmdline-pointer, r3: char
  563.     lbz    r3,0(r10)
  564.     cmpwi    r3,0x22            # " ?
  565.     beq    .skipquote
  566. .sk1:    cmplwi    r3,0x20
  567.     blelr
  568.     cmpwi    r3,0
  569.     beqlr
  570.     lbzu    r3,1(r10)
  571.     b    .sk1
  572. .skipquote:
  573.     lbzu    r3,1(r10)
  574.     cmpwi    r3,0
  575.     beqlr
  576.     cmpwi    r3,'*'            # escape?
  577.     bne    .sk2
  578.     lbzu    r4,1(r10)
  579.     cmpwi    r4,0
  580.     beqlr
  581. .sk2:    cmpwi    r3,0x22            # " ?
  582.     bne    .skipquote
  583.     lbzu    r3,1(r10)
  584.     blr
  585.  
  586.     .type    skiparg,@function
  587.     .size    skiparg,$-skiparg
  588.  
  589.  
  590. .constring:
  591.     .string    "CONSOLE:"
  592. .ifdef    WBSTART
  593. .nilstring:
  594.     .string    "NIL:"
  595. .endif
  596. .endif    # MINSTART
  597.     .byte    "startup V"
  598.     .byte    '0'+VERSION,'.','0'+(REVISION/10),'0'+(REVISION%10),0
  599.     .align    4
  600.  
  601.  
  602. # local data
  603.  
  604.     .type    _init_stk,@object
  605.     .size    _init_stk,4
  606.     .bss    _init_stk,4
  607.  
  608. .ifndef    MINSTART
  609.     .type    _startup_data,@object
  610.     .size    _startup_data,4
  611.     .bss    _startup_data,4
  612.  
  613.     .type    _argv,@object
  614.     .size    _argv,4
  615.     .bss    _argv,4
  616.  
  617. .ifdef    WBSTART
  618.     .type    _wbOutput,@object
  619.     .size    _wbOutput,4
  620.     .bss    _wbOutput,4
  621. .endif
  622. .endif
  623.  
  624.  
  625. # global data
  626.  
  627.     .global    SysBase
  628.     .type    SysBase,@object
  629.     .size    SysBase,4
  630.     .comm    SysBase,4
  631.  
  632. .ifndef    MINSTART
  633.     .global    _stdin
  634.     .type    _stdin,@object
  635.     .size    _stdin,4
  636.     .comm    _stdin,4
  637.  
  638.     .global    _stdout
  639.     .type    _stdout,@object
  640.     .size    _stdout,4
  641.     .comm    _stdout,4
  642.  
  643.     .global    _stderr
  644.     .type    _stderr,@object
  645.     .size    _stderr,4
  646.     .comm    _stderr,4
  647.  
  648. .ifdef    WBSTART
  649.     .global    WBenchMsg
  650.     .type    WBenchMsg,@object
  651.     .size    WBenchMsg,4
  652.     .comm    WBenchMsg,4
  653. .endif
  654. .endif
  655.  
  656. .ifdef    DEBUG
  657.     .bss    .regsave,11*4        # r0,r3,...,r12
  658.     .bss    .datastream,4*4        # max. 4 arguments
  659. .endif
  660.